// 实现并发控制器
class Scheduler {
  constructor(num) {
    this.list = []; // 用于存放异步任务
    this.num = num; // 控制允许并发的最大数量
    this.index = 0; // 用于记录当前系统存在的异步任务数量
  }

  // 向调度程序中加入promise任务
  // task 是一个可以产生 promise 的回调
  async add(task) {
    if (this.index >= this.num) {
      await new Promise((resolve) => this.list.push(resolve));
    }

    this.index++;
    let data = await task();
    console.log(data);
    this.index--;
    if (this.list.length > 0) {
      this.list.shift()();
    }
  }

  addTask(task) {
    this.add(task);
    return this;
  }
}

function getData(value, timer) {
  return () => {
    return new Promise((resolve) =>
      setTimeout(() => {
        resolve(value);
      }, timer)
    );
  };
}

const scheduler = new Scheduler(2);

scheduler
  .addTask(getData(100, 10000))
  .addTask(getData(200, 3000))
  .addTask(getData(300, 5000))
  .addTask(getData(400, 5000));
